export {}

class Person {//
    public name:string //= 'init name' //公有成员，默认为public加不加public都是一样的，建议加上
    private age:number//私有属性，只能够在类的内部去访问
    protected gender:boolean //外部无法访问
    constructor(name:string,age:number){
        this.name = name
        this.age = age
        this.gender = true
    }

    say(msg:string):void{
        console.log(`I am ${this.name},${msg}`)
        console.log(this.age)
    }
}
class Student extends Person{
    constructor(name:string,age:number){
        super(name,age)
        console.log(this.gender)//可以访问父类当中的gender属性，protect指的是只允许在子类当中去访问对应的成员
    }
}

const tom = new Person('tom',18)
console.log(tom.name)
// console.log(tom.age)//标为私有属性无法访问
// console.log(tom.gender)//外部访问出错

//===================================================
class Student extends Person{
    private constructor(name:string,age:number){//若是变成private，则这个类型就无法实例化了,也不能够被继承
        super(name,age)
        console.log(this.gender)
    }

    static create (name:string,age:number){
        return new Student(name,age)//使用类的方式创建这个类的实例，create方法还是在这个类的内部还是能够调用到这个类的构造函数的
    }
}
// const jack = new Student()//无法实例化，只能够在这个类的内部添加一个静态方法，然后在这个方法当中去创建这个类型的实例，因为private只允许在内部访问
const jack = Student.create('jack',18)